/**
 * 地理位置工具类
 * 基于高德地图API进行逆地理编码，将经纬度转换为详细地址
 */
import axios from 'axios';

const AMAP_KEY = 'f4a9d2af73baa386f745df84b4eeb777'; 

/**
 * 根据经纬度获取位置信息(使用高德SDK方式)
 * @param {Object} params - 位置参数
 * @param {number} params.longitude - 经度
 * @param {number} params.latitude - 纬度
 * @param {string} [params.coordinateSystem='2'] - 坐标系统类型，'2'表示GCJ-02(国测局坐标系)
 * @returns {Promise} 包含地址信息的Promise
 */
export const getAddressByLocation = async (params) => {
  console.log(params);
  
  // 如果没有设置API Key，提示错误
  if (!AMAP_KEY) {
    console.error('请配置高德地图API Key');
    throw new Error('高德地图API Key未配置');
  }

  // 确保参数合法
  if (!params || typeof params !== 'object') {
    throw new Error('参数不合法');
  }

  const { longitude, latitude, coordinateSystem = '2' } = params;

  // 验证经纬度
  if (!longitude || !latitude) {
    throw new Error('缺少经纬度参数');
  }

  try {
    // 加载高德地图SDK
    await loadAMapScript();
    
    // 判断坐标系统是否需要转换
    // 如果coordinateSystem不是'2'(高德坐标系)，可能需要转换
    let lng = longitude;
    let lat = latitude;
    
    // 可以根据需要在这里添加不同坐标系的转换

    return new Promise((resolve, reject) => {
      // 使用高德地图逆地理编码服务
      AMap.plugin('AMap.Geocoder', () => {
        const geocoder = new AMap.Geocoder();
        geocoder.getAddress([lng, lat], (status, result) => {
          if (status === 'complete' && result.info === 'OK') {
            const address = result.regeocode;
            resolve({
              status: 'success',
              formattedAddress: address.formattedAddress,
              addressComponent: address.addressComponent,
              original: address,
              location: { longitude, latitude }
            });
          } else {
            reject({
              status: 'error',
              message: `获取地址信息失败: ${result.info || status}`,
              location: { longitude, latitude }
            });
          }
        });
      });
    });
  } catch (error) {
    console.error('获取位置信息错误:', error);
    throw error;
  }
};

/**
 * 使用HTTP API方式获取位置信息(推荐)
 * 不需要加载整个高德地图SDK，更轻量级
 * @param {Object} params - 位置参数
 * @param {number} params.longitude - 经度
 * @param {number} params.latitude - 纬度
 * @param {string} [params.coordinateSystem='2'] - 坐标系统类型
 * @returns {Promise} 包含地址信息的Promise
 */
export const getLocationByHttp = async (params) => {
  // 如果没有设置API Key，提示错误
  if (!AMAP_KEY) {
    console.error('请配置高德地图API Key');
    throw new Error('高德地图API Key未配置');
  }

  // 确保参数合法
  if (!params || typeof params !== 'object') {
    throw new Error('参数不合法');
  }

  const { longitude, latitude, coordinateSystem = '2' } = params;

  // 验证经纬度
  if (!longitude || !latitude) {
    throw new Error('缺少经纬度参数');
  }

  try {
    // 使用高德地图HTTP API进行逆地理编码
    const url = `https://restapi.amap.com/v3/geocode/regeo`;
    
    const response = await axios.get(url, {
      params: {
        key: AMAP_KEY,
        location: `${longitude},${latitude}`,
        extensions: 'all', // 返回完整信息
        output: 'json'
      }
    });
    
    const { data } = response;
    
    if (data.status === '1' && data.info === 'OK') {
      return {
        status: 'success',
        formattedAddress: data.regeocode.formatted_address,
        addressComponent: data.regeocode.addressComponent,
        original: data.regeocode,
        location: { longitude, latitude }
      };
      
    } else {
      throw new Error(`获取地址信息失败: ${data.info || '未知错误'}`);
    }
  } catch (error) {
    console.error('获取位置信息错误:', error);
    throw error;
  }
};

/**
 * 动态加载高德地图SDK
 * @returns {Promise} 加载成功的Promise
 */
const loadAMapScript = () => {
  return new Promise((resolve, reject) => {
    // 如果已经加载了高德地图SDK，直接返回
    if (window.AMap) {
      resolve(window.AMap);
      return;
    }

    // 创建script标签，加载高德地图SDK
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.async = true;
    script.src = `https://webapi.amap.com/maps?v=2.0&key=${AMAP_KEY}&callback=initAMap`;
    
    // 定义回调函数
    window.initAMap = () => {
      resolve(window.AMap);
    };
    
    // 处理加载错误
    script.onerror = (e) => {
      reject(new Error('加载高德地图SDK失败'));
    };
    
    // 将脚本添加到文档中
    document.head.appendChild(script);
  });
};

/**
 * 将WGS84坐标系(GPS)转换为GCJ02(高德地图)
 * @param {number} lng - WGS84经度
 * @param {number} lat - WGS84纬度
 * @returns {Object} GCJ02坐标
 */
export const wgs84ToGcj02 = (lng, lat) => {
  // 定义一些常量参数
  const a = 6378245.0; // 长半轴
  const ee = 0.00669342162296594323; // 扁率
  
  if (outOfChina(lng, lat)) {
    return { lng, lat };
  }
  
  let dLat = transformLat(lng - 105.0, lat - 35.0);
  let dLng = transformLng(lng - 105.0, lat - 35.0);
  const radLat = lat / 180.0 * Math.PI;
  let magic = Math.sin(radLat);
  magic = 1 - ee * magic * magic;
  const sqrtMagic = Math.sqrt(magic);
  dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * Math.PI);
  dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * Math.PI);
  
  return {
    lng: lng + dLng,
    lat: lat + dLat
  };
};

// 判断坐标是否在中国范围外
function outOfChina(lng, lat) {
  return (lng < 72.004 || lng > 137.8347) || (lat < 0.8293 || lat > 55.8271);
}

// 转换纬度
function transformLat(x, y) {
  let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
  ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
  ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
  ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;
  return ret;
}

// 转换经度
function transformLng(x, y) {
  let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
  ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
  ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
  ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;
  return ret;
}

/**
 * 获取位置信息(推荐使用)
 * 根据提供的位置数据对象，获取详细地址信息
 * @param {Object} locationData - 位置数据对象
 * @param {number} locationData.latitude - 纬度
 * @param {number} locationData.longitude - 经度
 * @param {string} [locationData.coordinateSystem='2'] - 坐标系统
 * @param {string} [locationData.locationTime] - 定位时间
 * @param {number} [locationData.altitude] - 海拔高度
 * @returns {Promise} 包含地址信息的Promise
 */
export const getLocationInfo = async (locationData) => {
  try {
    // 解析位置数据
    const { latitude, longitude, coordinateSystem, locationTime, altitude } = locationData;
    
    // 调用HTTP API获取地址信息(推荐)
    const addressInfo = await getLocationByHttp({ latitude, longitude, coordinateSystem });
    
    // 合并信息
    return {
      ...addressInfo,
      locationTime,
      altitude,
      original: locationData
    };
  } catch (error) {
    console.error('获取位置信息失败:', error);
    return {
      status: 'error',
      message: error.message || '获取位置信息失败',
      original: locationData
    };
  }
}; 